Lazy loaded image
记录-MCP:Client-服务器回调Client模型
字数 1789阅读时长 5 分钟
2026-5-25
2026-5-25
AI智能摘要
GPT
这里是萌新AI,这篇文章介绍了 MCP 开发中如何解决 Server 端模型固定问题。文章首先指出将 API 和 KEY 配置在 Server 端会导致客户无法使用偏好模型。接着,它定义了 Client 主要用于获取工具列表和交互,并重点讲解了通过 session.create_message 实现 Server 调用 Client 端模型的方法。最后,文章通过代码示例展示了 Client 如何建立连接并获取 Server 工具列表。
URL
type
Post
status
Published
date
May 25, 2026
slug
mcp client1
summary
MCP client
tags
实用教程
Python
大模型
推荐
category
大模型
icon
password
😀
这篇博客主要讲解MCP Server调用大模型的方法。一般情况下,博主会将模型的API和KEY配置在Server端。但是,这会造成一个问题:在实际业务中,客户使用产品时,有自己的偏好模型。如果博主设置在Server端,那么模型固定,不易修改。今天这篇博客主要记录MCP的Server端如何使用Client端大模型生成的结果。

📝 Client基本概念

在MCP开发中,我们很少去实现MCP Client端的代码。这是因为在日常开发中,我们很少将大模型的API和KEY授权给服务端,主要实现一些数学统计、文件删除、文件读取等功能。但是,随着MCP Server的发展,出现了一些工具,必须借助大模型完成总结、text2sql等的操作。

什么是Client?

博主个人认为MCP Client主要用于获取显示MCP Server端的工具集合、管控相关配置信息以及与Server进行交互。
那么,Client代码中主要有两个部分:获取目标Server的工具列表和执行目标Server工具。如果想要在此基础上实现模型生成信息传递,那么需要在执行目标Server工具中使用Server向Client发起请求的方法(session.create_message)。
上面这一段话有点绕口,也不是很直观。不要慌张,请伙伴们接着往下阅读。

🤗 代码

Client客户端有两个非常重要的部分:获取Server工具列表和执行目标Server工具。

简单例子

首先,需要导入mcp的streamable_http_client和ClientSession类。
streamable_http_client类作用如下:
  • 用于建立Client和Server之间的通信连接,返回read_stream、write_stream和get_session_id_callback。其中,read_stream获取Server端信息,write_stream向Server端写入信息,get_session_id_callback会话ID。两种方法:with streamable_http_client() as (read_stream, write_stream, session_id)和streamablehttp_client().__aenter__()。
    • with streamable_http_client() as (read_stream, write_stream, session_id)是自动上下文管理器相当于streamable_http_client().__aenter__()+streamable_http_client().__aexit__()。
    • 虽然with streamable_http_client() as (read_stream, write_stream, session_id)使用方便,但是当我们需要一个会话在不同地方调用时,那么需要使用的是streamable_http_client().__aenter__()和streamable_http_client().__aexit__()。
ClientSession类作用如下:
  • 建立与管理Client和Server之间的会话。两种方法:with ClientSession() as session 和 ClientSession().__aenter__()。
    • with ClientSession() as session是自动上下文管理器相当于ClientSession().__aenter__()+ClientSession().__aexit__()。
    • 虽然with ClientSession() as session使用方便,但是当我们需要一个会话在不同地方调用时,那么需要使用的是ClientSession().__aenter__()和ClientSession().__aexit__()。
  • ClientSession类有几个重要函数:initialize()、list_tools()、call_tool()
    • initialize():用于Client和Server的初始化握手。可以理解为:建立沟通通道。
    • list_tools():获取Server端的所有工具名称。
    • call_tool():调用Server端的目标工具。
  • Server端发起回调,两个构造函数:sampling_callback和elicitation_callback。
    • elicitation_callback:Server服务端需要获取用户的指令。
    • sampling_callback:Server服务端需要获取Client模型生成的文本数据。
注意
为了让streamable_http_client建立的网络连接能够持久一些,博主这里使用的streamable_http_client().__aenter__()+streamable_http_client().__aexit__()方法。
接着,创建Client和Server网络连接类。
再接着,使用with ClientSession() as session创建会话管理执行初始化握手、获取所有工具和调用工具。这里的Weather工具使用的是记录-MCP:FastMCP创建server方法(二)
最后,执行main函数。
notion image

复杂例子

上述简单例子中,Client和Server交互流程(排除初始握手)如下:
notion image
但是,博主想要实现Server能够回调Client的大模型。如下图:
notion image
首先,简单例子的基础上增加sampling_callback函数。
接着,将回调函数放入到async with ClientSession(read_stream, write_stream, sampling_callback=sampling_callback) as session_manager中。同时,我们也需要为cal_tool函数中的arguments增加参数。
再接着,客户端已经完成,但是需要完善Server中的工具函数的代码,增加session.create_message的使用。由于Weather工具使用的是FastMCP创建,所以博主依然使用该类进行补充。
最后,启动测试。
  • 客户端结果
notion image
  • 服务端结果
notion image
 
💡
欢迎您在底部评论区留言,一起交流~
上一篇
记录-MCP:FastMCP创建server方法(二)
下一篇
记录-MCP:Client-服务器行为用户确认

评论
Loading...